package com.sakura.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.Arrays;

/**
 * 切面类
 */

//@Aspect： 告诉Spring当前类是一个切面类
@Aspect
public class LogAspects {

    //抽取公共的切入点表达式
    //1、本类引用 直接调用方法名
    //2、其他的切面引用 包名引用
    @Pointcut("execution(public int com.sakura.aop.MathCalculator.*(..))")
    public void pointCut() {
    }

    //@Before在目标方法之前切入；切入点表达式（指定在哪个方法切入）
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint) {
        String name = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        System.out.println(name + " 运行" + ",@Before 参数为：{" + Arrays.asList(args) + "}");
    }

     //后置通知(@After)：logEnd：在目标方法(div)运行结束之后运行（无论方法正常结束还是异常结束）
    @After("pointCut()")
    public void logEnd(JoinPoint joinPoint) {
        String name = joinPoint.getSignature().getName();
        System.out.println(name + "运行结束" + " @After...");
    }

    //返回通知(@AfterReturning)：logReturn：在目标方法(div)正常返回之后运行
    //JoinPoint一定要出现在参数表的第一位
    @AfterReturning(value = "pointCut()", returning = "result")
    public void logReturn(JoinPoint joinPoint, Object result) {
        String name = joinPoint.getSignature().getName();
        System.out.println(name+"正常放回"+" @AfterReturning 放回结果为{"+result+"}");
    }

    //异常通知(@AfterThrowing)：logException：在目标方法(div)出现异常以后运行
    @AfterThrowing(value = "pointCut()",throwing = "exception")
    public void logException(JoinPoint joinPoint,Exception exception){
        String name = joinPoint.getSignature().getName();
        System.out.println(name+"异常放回, @AfterThrowing 异常为{"+exception+"}");
    }
}

